// 给两个整数数组 A 和 B ，返回两个数组中公共的、长度最长的子数组的长度。

function findLength(A: number[], B: number[]): number {
  const rows = A.length;// 存储行信息
  const cols = B.length;// 存储列信息
  const dp: number[][] = []; // 初始化二维DP矩阵
  for (let i = 0; i <= rows; i++) {
    dp.push(new Array(cols + 1).fill(0));
  }
  let res: number = 0; // 声明结果变量
  for (let i = 1; i <= rows; i++) {
    for (let j = 1; j <= cols; j++) {
      if (A[i - 1] === B[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1; // 动态更新二维DP矩阵
      res = Math.max(res, dp[i][j]);// 动态维护res变量
    }
  }
  return res;
}

// 这道题目采用的是一个动态规划算法
// 我们把数组A\B想象成是矩阵的行和列，就可以得到一个二维的dp矩阵网格
// 如何保证子数组是连续的，只需要保证在计算范围在矩阵上是一条连续的对角线
// 最直接的情况，假设当前的A\B数组判断位置元素是相等的，
// 那么包含这两个数组的元素作为结尾的最长子数组的长度
// 就是它们前缀相等的长度（最短为0）+1
// 而它们前缀的长度我们仍然可以基于这个思路来求解，
// 于是我们就可以找到条件转移方程来不断求解这个最小子问题
// dp的[i][j]元素即代表截止到A[i-1]、B[j-1]的最长子数组长度
// 处于边界考虑，我们申请的矩阵大小为行列数+1，并给矩阵的初值元素全部赋值为0
// 遍历这个二维的dp矩阵网格，我们不断地判断当前的A[行数-1]与B[列数-1]是否相等
// 如果相等我们就为当前元素赋值为它的对角线左上位置数值再+1
// 然后不断地维护一个res变量，来根据矩阵元素计算出最长长度即可。
